package com.aizuda.boot.modules.third.wps.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.aizuda.boot.modules.business.contract.util.AuthUtil;
import com.aizuda.boot.modules.third.wps.domain.dto.XUserQuery;
import com.aizuda.boot.modules.third.wps.domain.vo.FileDownloadVo;
import com.aizuda.boot.modules.third.wps.domain.vo.FileInfoVo;
import com.aizuda.boot.modules.third.wps.domain.vo.FilePermissionVo;
import com.aizuda.boot.modules.third.wps.domain.vo.ResponseDTO;
import com.aizuda.boot.modules.third.wps.enums.WebOfficeHeader;
import com.aizuda.boot.modules.third.wps.service.PreviewService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author hjw
 * @description 文件预览相关接口
 * @date 2025年06月13日 16:30
 */
@Tag(name = "WebOffice文件预览接口", description = "WebOffice文件预览接口")
@RestController
@RequestMapping("third/wps/v3/3rd/files")
public class PreviewFileController {

    @Autowired
    private PreviewService previewService;

    /**
     * 获取预览文件信息
     *
     * @param fileId 文件 ID
     * @return ResponseDTO<PreviewFileInfoVo>
     */
    @Operation(summary = "获取预览文件信息", description = "获取指定文件的预览信息")
    @GetMapping("{fileId}")
    public ResponseDTO<FileInfoVo> getPreviewFileInfo(@PathVariable String fileId) {


        // 校验文件 ID 是否有效
        previewService.validateFileId(fileId);
        // 获取预览文件信息
        return ResponseDTO.success(previewService.getPreviewFileInfo(fileId));
    }

    /**
     * 获取文件下载地址
     *
     * @param fileId 文件 ID
     */
    @Operation(summary = "获取文件下载地址", description = "获取指定文件的下载地址")
    @GetMapping("{fileId}/download")
    public ResponseDTO<FileDownloadVo> getFileDownloadUrl(@PathVariable String fileId,
                                                          @RequestHeader(WebOfficeHeader.X_WEB_OFFICE_TOKEN)
                                                          String xWebOfficeToken) {

        // 校验文件 ID 是否有效
        previewService.validateFileId(fileId);
        // 获取文件下载地址
        FileDownloadVo fileDownloadUrl = previewService.getFileDownloadUrl(fileId);
        fileDownloadUrl.setHeaders(
                Map.of(WebOfficeHeader.X_WEB_OFFICE_TOKEN, xWebOfficeToken)
        );
        return ResponseDTO.success(fileDownloadUrl);
    }

    /**
     * 获取文件权限
     *
     * @param fileId 文件 ID
     */
    @Operation(summary = "获取文件权限", description = "获取指定文件的权限信息")
    @GetMapping("{fileId}/permission")
    public ResponseDTO<FilePermissionVo> getFilePermission(@PathVariable String fileId, @RequestHeader("X-User-Query") String userQuery) {

        XUserQuery param = new XUserQuery();
        // 将请求头中的用户查询参数转换为对象
        if (StrUtil.isNotBlank(userQuery)) {
            // 解析 userQuery 字符串为 Map
            Map<String, String> paramMap = StrUtil.split(userQuery, "&")
                    .stream()
                    .map(s -> StrUtil.split(s, "="))
                    .filter(arr -> arr.size() == 2)
                    .collect(Collectors.toMap(arr -> arr.get(0), arr -> arr.get(1)));
            // 将 Map 转换为 XUserQuery 对象
            BeanUtil.copyProperties(paramMap, param);

        }
        // 校验文件 ID 是否有效
        previewService.validateFileId(fileId);
        param.setFileId(fileId);


        // 获取用户 ID
        String userId = AuthUtil.getCurrentUser().getUserId();

        // 获取文件权限
        return ResponseDTO.success(previewService.getFilePermission(param, userId));
    }

}
